/**
 * 员工管理系统-管理员API
 * 
 * 
 **/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include "admin_API.h"

//错误信息
#define ERR_FLAG(info) do{printf("%s:%s:%d>>%s\n",__FILE__,__func__,__LINE__,info);}while(0)

/* 
 * @func 管理员的登录请求   cmd = 0x10
 * @para int sockfd                 要连接的服务器sockid
 * @para login_info_TypeDef *data   登陆信息:用户名、密码
 * @return   0:登陆成功
 *          -1:登陆失败
 *          -2:参数错误
 *          -3:发送错误
 *          -4:接收错误
 */
int staff_admin_login(int sockfd,char usermode,char *name,char *pwd)
{
    printf("debug1\n");
    Staff_Data_TypeDef trans_data;
    if(NULL == name || NULL == pwd || sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));

    trans_data.cmd = 0x10;
    trans_data.staff_info.mode = usermode;
    trans_data.imode = usermode;

    strcpy(trans_data.staff_info.name,name);
    strcpy(trans_data.staff_info.pwd,pwd);

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }
 
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
        perror("recv err");
        return -4;  //接收错误
    }

    if(strstr(trans_data.data,"ok")){
        return 0;
    }else{
        printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
        return -1;
    }
    return 0;
}

/* 
 * @func 管理员 添加员工信息 cmd = 0x20；
 * @para int sockfd                 要连接的服务器sockid
 * @para staff_info_TypeDef *data   要添加的员工信息
 * @return   0：添加成功
 *          -1：添加失败
 *          -2:参数错误
 *          -3:发送错误
 *          -4:接收错误
 */
int staff_admin_add(int sockfd,char usermode,staff_info_TypeDef *data)
{
    printf("debug2\n");
    Staff_Data_TypeDef trans_data;
    if(NULL == data || sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));

    trans_data.cmd = 0x20;
    trans_data.staff_info.mode = usermode;
    trans_data.imode = usermode;

    trans_data.staff_info = *data;

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }

    printf("添加中...\n");

    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
        perror("recv err");
        return -4;  //接收错误
    }

    if(!strcmp(trans_data.data,"ok")){
        return 0;
    }else{
        printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
        return -1;
    }
    return 0;
}

/* 
 * @func 管理员根据姓名查找员工信息 cmd:0x51
 *          没有考虑重名的情况，认为没有重名
 * @para int sockfd   要连接的服务器sockid
 * @para char *name   要查找的姓名
 * @para staff_info_TypeDef *info_o 用于保存员工信息的地址
 * @return   0：添加成功
 *          -1：添加失败
 *          -2:参数错误
 *          -3:发送错误
 *          -4:接收错误
 */
int staff_admin_find_By_name(int sockfd,char usermode,char *name,staff_info_TypeDef *info_o)
{
    printf("debug3\n");
    Staff_Data_TypeDef trans_data;
    if(NULL == name || sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));

    trans_data.cmd = 0x51;
    trans_data.imode = usermode;
    trans_data.staff_info.mode = usermode;

    strcpy(trans_data.staff_info.name,name);

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }
    printf("查询中...\n");
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
        perror("recv err");
        return -4;  //接收错误
    }

    if(strstr(trans_data.data,"ok")){
        (*info_o) = trans_data.staff_info;
        printf("%d,    %d,	  %s，	%s,   %d，   %s，  %s，   %s，	 %s，   %s，  %d\n",
																info_o->id,info_o->mode,
																info_o->name,info_o->pwd,
																info_o->age,info_o->phone,
																info_o->addr,info_o->job,
																info_o->time,info_o->state,info_o->salary);
        return 0;
    }else{
        printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
        return -1;
    }

    return 0;   
}

/* 
 * @func 管理员查找所有员工信息 cmd:0x60
 * @para int sockfd                    要连接的服务器sockid
 * @para staff_info_TypeDef **info_o    保存查找到的结果：结构体指针数组
 * @pata int *num                      保存查找到的个数
 * @return   0: 查找成功
 *          -1: 查找失败
 *          -2: 参数错误
 *          -3: 发送错误
 *          -4: 接收错误
 */
int staff_admin_find_all(int sockfd, char usermode,staff_info_TypeDef **info_o, int *num)
{
    printf("debug4\n");
    Staff_Data_TypeDef trans_data;
    if(sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    
    trans_data.cmd = 0x60;
    trans_data.imode = usermode;
    trans_data.staff_info.mode = usermode;

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }

    printf("查找中...\n");
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    while(1){ //一直等待接收，此处可以改成io多路复用
        if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
            perror("recv err");
            return -4;  //接收错误
        }

        if(strstr(trans_data.data,"ok")){
            if(trans_data.cmd == 0x60){
            printf("id=%d,mode=%d,name=%s,pwd=%s\n",trans_data.staff_info.id,
                                                    trans_data.staff_info.mode,
                                                    trans_data.staff_info.name,
                                                    trans_data.staff_info.pwd);
            }else{
                printf("cmd=%x\n",trans_data.cmd);
            }
        }else if(strstr(trans_data.data,"end")){ 
            printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
            break;
        }
        else{
            printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
            return -1;
        }
    }
    return 0;       
}
/* 
 * @func 管理员根据工号修改员工信息
 * @para int sockfd                 要连接的服务器sockid
 * @para char flag                  要修改信息的标志位：0x40 修改姓名
 *                                                   0x41 修改年龄
 * @para staff_info_TypeDef *data   要修改的员工信息
 * @return   0：修改成功
 *          -1：修改失败
 *          -2:参数错误
 *          -3:发送错误
 *          -4:接收错误
 */
int staff_admin_modify(int sockfd,char usermode,char cmd,staff_info_TypeDef *data) 
{
    printf("debug5\n");
    Staff_Data_TypeDef trans_data;
    if(NULL == data || sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    trans_data.cmd = cmd;
    trans_data.imode = usermode;
    trans_data.staff_info.mode = usermode;
    trans_data.staff_info = *data;

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }
    printf("修改中...\n");
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
        perror("recv err");
        return -4;  //接收错误
    }

    if(!strcmp(trans_data.data,"ok")){
        return 0;
    }else{
        printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
        return -1;
    }
    return 0;      
}

/* 
 * @func 管理员删除员工信息
 * @para int sockfd                 要连接的服务器sockid                                           0x41 修改年龄
 * @para int  id                    要删除的id号
 * @para char *name                 要删除的姓名
 * @return   0：删除成功
 *          -1：删除失败
 *          -2:参数错误
 *          -3:发送错误
 *          -4:接收错误
 */
int staff_admin_del_by_id(int sockfd,char usermode,int id,char *name) 
{
    printf("debug6\n");
    Staff_Data_TypeDef trans_data;
    if(NULL == name || sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));

    trans_data.cmd = 0x30;
    trans_data.imode = usermode;
    trans_data.staff_info.mode = usermode;

    trans_data.staff_info.id = id;
    strcpy(trans_data.staff_info.name,name);

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }

    printf("删除中...\n");
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
        perror("recv err");
        return -4;  //接收错误
    }

    if(!strcmp(trans_data.data,"ok")){
        return 0;
    }else{
        printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
        return -1;
    }
    return 0;      
}

/* 
 * @func 管理员查找历史信息 cmd:0x70
 * @para int sockfd                    要连接的服务器sockid
 * @para staff_info_TypeDef **info_o    保存查找到的结果：结构体指针数组
 * @pata int *num                       保存查找到的个数
 * @return   0: 查找成功
 *          -1: 查找失败
 *          -2: 参数错误
 *          -3: 发送错误
 *          -4: 接收错误
 */
int staff_admin_find_history(int sockfd,char usermode)
{
    printf("debug7\n");
    Staff_Data_TypeDef trans_data;
    if(sockfd < 0){
       ERR_FLAG("para err");
       return -2;
    }
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    
    trans_data.cmd = 0x70;
    trans_data.imode = usermode;
    trans_data.staff_info.mode = usermode;

    if(-1 ==send(sockfd,&trans_data,sizeof(Staff_Data_TypeDef),0)){
        perror("send err");
        return -3; //发送错误
    }

    printf("历史记录查寻中...\n");
    memset(&trans_data,0,sizeof(Staff_Data_TypeDef));
    while(1){ //一直等待接收，此处可以改成io多路复用
        if(-1 == recv(sockfd,&trans_data, sizeof(Staff_Data_TypeDef), 0)){
            perror("recv err");
            return -4;  //接收错误
        }

        if(strstr(trans_data.data,"ok")){
            if(trans_data.cmd == 0x70){
                printf("%s\n",trans_data.history);
            }else{
                printf("cmd=%#x\n",trans_data.cmd);
            }
        }else if(strstr(trans_data.data,"end")){ 
            break;
        }
        else{
            printf("%s%d:%s\n",__func__,__LINE__,trans_data.data);
            return -1;
        }
    }
    return 0; 
}





























